package edu.uoc.tdp.pac3.server;

import java.sql.*;
import java.util.Vector;
import edu.uoc.tdp.pac3.*;
import edu.uoc.tdp.pac3.common.EstatEvent;
import edu.uoc.tdp.pac3.common.Event;

/**
 * Classe que gestiona les dades persistents de Event
 */
public class GestorDiscEvent {
	/** Objecte connexio */
	private Connection connexio;
	/** Objecte gestor connexio disc */
	private GestorConnexioDisc gcd;
	
	/**
	 * Constructor amb un parametre de la classe GestorDiscEvent
	 * 
	 */	
	public GestorDiscEvent(GestorConnexioDisc pGcd){
		gcd = pGcd;
		connexio = pGcd.getConexion();
	}
	
	/**
	 * Metode per a obtenir la llista de tots els events
	 * @return Vector
	 * @throws SQLException
	 * @throws Exception
	 */
	public Vector<Event> obtenirEvents() throws SQLException, Exception{

		Vector<Event> v = null;
			
		Statement sentencia = gcd.crearSentencia(); //Crea la sentencia
		connexio.setAutoCommit(false);
		String consulta =("SELECT * FROM event ORDER BY data_desde");
			
		ResultSet rs = sentencia.executeQuery(consulta);
		if (rs != null){
			v = new Vector<Event>();
			while (rs.next()){
				int id_Event = rs.getInt(1);
				String nom = rs.getString(2);
				Date data_desde = rs.getDate(3);
				Date data_fins = rs.getDate(4);
				Event event = new Event(id_Event, nom, data_desde, data_fins);
				v.add(event);
			}
		}
		connexio.commit();
		connexio.setAutoCommit(true);
		sentencia.close();
			
		return v;
			
	}

	/**
	 * Metode per a obtenir la llista de tots els estats dels events
	 * Retorna l'event amb el numero d'acreditacions per tipus d'empresa
	 * @param Event
	 * @return Vector
	 * @throws SQLException
	 * @throws Exception
	 */
	public Vector<EstatEvent> obtenirEstatEvents(Event event) throws SQLException, Exception {

		Vector<EstatEvent> v = null;
			
		Statement sentencia = gcd.crearSentencia(); //Crea la sentencia
		connexio.setAutoCommit(false);
		String consulta =("SELECT empleat_empresa.tipus_empresa, COUNT(acreditacio.id_empleat) AS ACREDITACIONS " +
							"FROM acreditacio INNER JOIN (SELECT empresa_externa.tipus_empresa, empleat_extern.id_empleat " +
								"FROM empleat_extern INNER JOIN empresa_externa ON " +
								"empleat_extern.cif_empresa = empresa_externa.cif_empresa) " +
							"AS empleat_empresa ON acreditacio.id_empleat = empleat_empresa.id_empleat " +
							"WHERE acreditacio.id_event = " + event.getId_Event() +
							"GROUP BY acreditacio.id_event,empleat_empresa.tipus_empresa");
			
		ResultSet rs = sentencia.executeQuery(consulta);
		if (rs != null){
			v = new Vector<EstatEvent>();
			while (rs.next()){
				String tipus_empresa = rs.getString(1);
				int num_acreditacions = rs.getInt(2);
				EstatEvent estatEvent = new EstatEvent(event, tipus_empresa, num_acreditacions);
				v.add(estatEvent);
			}
		}
		connexio.commit();
		connexio.setAutoCommit(true);
		sentencia.close();
			
		return v;
			
	}
}